package com.youli.gb.utils;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import org.apache.ibatis.session.SqlSession;

/**
 * 事务处理器：事务都应该定义在业务逻辑层
 * @author sjxy
 * 
 * 功能：
 *  1 能获取业务逻辑层的对象，原来的创建方式：ISysRoleService roleService = new SysRoleServiceImpl();
 *             现在通过代理方式的创建
 *  2 能够自动执行业务逻辑层对象的方法，比如自动执行	roleService 的方法 getById
 *  3 在执行某个方法之前和之后均执行特定的逻辑
 *  
 *实现途径：
 *  
 */
public class TransactionHandler implements InvocationHandler{
	
	//目标对象,比如这里对应的可能是roleService
	private Object target;

	public TransactionHandler(Object target) {
		super();
		this.target = target;
	}
	
	//获取代理对象的方法
	public Object getProxy() {
		return Proxy.newProxyInstance(target.getClass().getClassLoader(),  target.getClass().getInterfaces(), this);
	}

	/**
	 * proxy:代理对象
	 * method:代理对象中将要被执行的方法
	 * args：待执行方法的参数
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		SqlSession sqlSession = null;
		Object retValue = null;
		
		try {
			sqlSession = DBUtils.getSqlSession();
			retValue = method.invoke(target, args);//执行目标方法
			sqlSession.commit();//方法执行成功
		} catch (Exception e) {
			sqlSession.rollback();//方法执行失败
			e.printStackTrace();
		} finally {
			sqlSession.close();//不管执行结果如何，均要关闭SqlSession
		}		
		return retValue;		
	}	
}

























